package com.lg.distributed.transaction.message.coordinator;

import com.lg.distributed.transaction.message.model.RabbitMetaMessage;

import java.util.List;

/**
 * 持久化的顶层接口
 *
 * @author by Mr. Li 2020/12/11 22:28
 */
public interface DBCoordinator {
    /**
     * 设置信息为prepare状态
     *
     * @param msgId
     */
    void setMsgPrepare(String msgId);

    /**
     * 设置消息为ready状态，删除prepare状态
     *
     * @param msgId
     * @param rabbitMetaMessage
     */
    void setMsgReady(String msgId, RabbitMetaMessage rabbitMetaMessage);

    /**
     * 消息发送成功，删除ready状态
     *
     * @param msgId
     */
    void setMsgSuccess(String msgId);

    /**
     * 从db中获取消息实体
     *
     * @param msgId
     * @return
     */
    RabbitMetaMessage getMetaMsg(String msgId);

    /**
     * 获取素有ready状态
     *
     * @return
     */
    List<RabbitMetaMessage> getMsgReady() throws Exception;

    /**
     * 获取prepare状态消息
     */
    List<RabbitMetaMessage> getMsgPrepare() throws Exception;

    /**
     * 消息重发次数+1
     */
    Long incrResendKey(String key, String hashKey);

    /**
     * 获取 retry 次数
     *
     * @param key
     * @param hashKey
     * @return
     */
    Long getResendValue(String key, String hashKey);
}
